home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / dfs1 / dfs1.c next >
Text File  |  1993-07-08  |  5KB  |  229 lines

  1. /*                                 */
  2. /*   12dot font test 1992-12-28    */
  3. /*                                 */
  4. #include <string.h>
  5. #include <egb.h>
  6. #include <mos.h>
  7. #include <fmcfrb.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <sidework.h>
  11. #include <snd.h>
  12. #include <smsg.h>
  13. #include <dos.h>
  14. #include <msdos.cf>
  15.  
  16.  
  17. #define iskanji(c)   ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))
  18.  
  19. static unsigned short fontSeg,dataSeg;
  20.  
  21.  
  22. #define BACK        15
  23. #define PANT        8
  24.  
  25. #define EgbParaSize 64
  26.  
  27. #define TRUE         1
  28. #define FALSE        0
  29.  
  30. char SND_work[0x4000];
  31. char EGB_work[4096];
  32. char EGB_para[EgbParaSize];
  33. char MOS_work[MosWorkSize];
  34. int type=0,strt=0,endt=0,sw=0;
  35. char    buf[1024],buf2[1024],pat_work[258];
  36.  
  37. void rectangle(int x1, int y1, int x2, int y2)
  38. {
  39.     WORD(EGB_para + 0) = x1;
  40.     WORD(EGB_para + 2) = y1;
  41.     WORD(EGB_para + 4) = x2;
  42.     WORD(EGB_para + 6) = y2;
  43.     EGB_rectangle(EGB_work, EGB_para);
  44. }
  45.  
  46. int wait_click()
  47. {
  48.     int b,x,y;
  49.     MOS_disp(1);
  50.     b = 0;
  51.     while(b == 0){
  52.         MOS_rdpos(&b,&x,&y);
  53.         if(b == 2){
  54.             sdk_invoke();
  55.             b = 0;
  56.         }
  57.     }
  58.     MOS_disp(0);
  59.     return b;
  60. }
  61. static unsigned short sjis2jis(unsigned short chr)
  62. {
  63.     int    ch,cl;
  64.  
  65.     ch = (chr >> 8) & 0xff; cl = chr & 0xff;
  66.  
  67.     ch -= ( ch <= 0x9f) ? 0x71 : 0xb1;
  68.     ch = (ch << 1)+1;
  69.  
  70.     if ( cl > 0x7f ) cl--;
  71.     if ( cl >= 0x9e ) {
  72.         cl -= 0x7d;
  73.         ch++;
  74.     } else {
  75.         cl -= 0x1f;
  76.     }
  77.  
  78.     return (unsigned short)(ch << 8 | cl);
  79. }
  80.  
  81. static void font_init()
  82. {
  83.     fontSeg = mma_allocSeg("FONT");
  84.     dataSeg = sdk_getDS();
  85. }
  86.  
  87. static void font_end()
  88. {
  89.     mma_freeSeg(fontSeg);
  90. }
  91.  
  92. static int font_getSjisKanji(unsigned short s,char *buf)
  93. {
  94.     unsigned short j,jh,jl;
  95.     unsigned int ofst;
  96.  
  97.     j = sjis2jis(s);
  98.     if (j > 0x4fff) return -1; /* 2水漢字はダメ */
  99.     jh = j >> 8;
  100.     jl = j & 0xff;
  101.  
  102.     ofst = ((jh-0x21)*94+jl-0x21)*24+0xc00;
  103.     _movedata(fontSeg,ofst,dataSeg,(unsigned int)buf,24);
  104.     return 0;
  105. }
  106.  
  107. static void font_getAnk(char c,char *buf)
  108. {
  109.     unsigned int ofst;
  110.  
  111.     ofst = c*12;
  112.     _movedata(fontSeg,ofst,dataSeg,(unsigned int)buf,12);
  113. }
  114.  
  115. static void font_put(int x,int y,char *str)
  116. {
  117.     char    buf[24];
  118.     char    para[9] = {0};
  119.     int    i;
  120.  
  121.     if (str == NULL) return;
  122.  
  123.     WORD(¶[0]) = x;
  124.     WORD(¶[2]) = y+12;
  125.     WORD(¶[4]) = 0;
  126.     EGB_sjisString(EGB_work,para);/* 位置決め */
  127.  
  128.     while (*str != 0) {
  129.         if (iskanji(*str)) {
  130.  
  131.             WORD(¶[6]) = *(unsigned short *)str;
  132.             i = font_getSjisKanji(((*str++ << 8) + *str++),buf);
  133.  
  134.             if (i == 0) {/*1水漢字*/
  135.                 EGB_textZoom(EGB_work,1,16,12);
  136.                 EGB_anyChar(EGB_work,16,12,buf);
  137.             } else {/*2水漢字*/
  138.                 EGB_textZoom(EGB_work,1,12,12);
  139.                 WORD(¶[4]) = 2;
  140.                 EGB_sjisString(EGB_work,para);
  141.                 WORD(¶[4]) = 0;
  142.             }
  143.  
  144.             WORD(¶[0]) += 12;
  145.  
  146.         } else {
  147.  
  148.             font_getAnk(*str++,buf);
  149.  
  150.             EGB_textZoom(EGB_work,1,8,12);
  151.             EGB_anyChar(EGB_work,8,12,buf);
  152.             WORD(¶[0]) += 6;
  153.         }
  154.         EGB_sjisString(EGB_work,para);/* 位置決め */
  155.  
  156.     }
  157. }
  158. void main(int argc,char *argv[])
  159. {
  160.     char spr[200];
  161.     long avi_cls,cls_drv,byt_sec,sec_cls,cls_siz,mega=0L;
  162.     int    drv,id,y=90;
  163.     
  164.     EGB_resolution( EGB_work,0,0x43 );
  165.     EGB_resolution( EGB_work,1,0x43 );
  166.     EGB_color(EGB_work, 2, BACK);   
  167.     EGB_paintMode(EGB_work, 0x22);
  168.     MOS_start(MOS_work, MosWorkSize);
  169.     MOS_resolution(1,3);
  170.     MOS_writePage(1);
  171.     MOS_setpos(80,90);
  172.     MOS_color(0,15);
  173.     MOS_typeRom(82,0,0,pat_work);
  174.     MOS_disp(1);
  175.     SND_init(SND_work);
  176.     SND_elevol_mute(0x01);
  177.     SMSG_open(SND_work);
  178.  
  179.     EGB_color(EGB_work, 0, PANT);
  180.     rectangle(79, 89, 561, 391);
  181.     EGB_color(EGB_work, 0, PANT);
  182.  
  183.     font_init() ;
  184.  
  185.  
  186.     FM_SetVector();
  187.  
  188.     sprintf(spr," ドライブ空き容量一覧 DFS1.EXP Copyright 1993 (c) Rassyai");
  189.     font_put(81,y,spr);
  190.     y+=12;
  191.     sprintf(spr,"ドライブ  合計                   空き");
  192.     font_put(81,y,spr);
  193.     for(drv = (argc==1 ? 1:atoi(argv[1]));drv<26;drv++){
  194.       if(drv == 15) break;
  195.         Registers.AX.LH.H = 0x36;
  196.         Registers.DX.R = drv;
  197.         calldos();
  198.         if(Registers.AX.R == 0xFFFF) continue;
  199.         avi_cls = (long)Registers.BX.R;
  200.         cls_drv = (long)Registers.DX.R;
  201.         byt_sec = (long)Registers.CX.R;
  202.         sec_cls = (long)Registers.AX.R;
  203.         cls_siz = sec_cls * byt_sec;
  204.         sprintf(spr,"%c: %9ldバイト(%7ldKB) %9ldバイト(%7ldKB)[%3ld%%USED]",'A' + drv - 1,
  205.         cls_drv * cls_siz,(cls_drv * cls_siz)/1024,
  206.         avi_cls * cls_siz,(avi_cls * cls_siz)/1024,
  207.         100 - (avi_cls * cls_siz /1024 * 100)/(cls_drv * cls_siz / 1024));
  208.         mega += (avi_cls * cls_siz)/1024;
  209.         y += 12;
  210.         font_put(81,y,spr);
  211.  
  212.     }
  213.     sprintf(spr," 約%5ld Kバイトが使用可能です。 マウス左ボタンを押して下さい。",mega);
  214.     y += 12;
  215.     font_put(81,y,spr);
  216.     FM_ResetVector();
  217.     font_end() ;
  218.     id = SMSG_CHIME;
  219.     SMSG_play(id, 0);
  220.     MOS_typeRom(125,0,0,pat_work);
  221.     wait_click();
  222.     SND_pcm_play_rom(71,62,127,5);
  223.     SMSG_close();
  224.     SND_end();
  225.     MOS_end();
  226.     exit(0);
  227.  
  228. }
  229.